Ký Request API Seller (multipart/form-data)
API Tạo Seller và Cập Nhật Seller gửi dữ liệu dạng
multipart/form-data (vì có kèm upload file trong trường files), khác với phần lớn API khác
của Baokim gửi application/json. Vì vậy cách tính chữ ký (Signature) cho 2 API này khác với hướng
dẫn chung ở trang Giới thiệu API Baokim — trang này bổ sung riêng phần khác biệt đó.
Trước khi đọc tiếp, đối tác cần nắm rõ phần 6. Chi tiết định dạng Signature
và 7. Hướng dẫn bảo mật chung ở trang Giới thiệu — các quy
định về keyVersion, algorithm, cặp khóa RSA/ED25519, header Signature vẫn áp dụng nguyên vẹn,
chỉ riêng nội dung được đem đi ký (plaintext) là khác.
1. Sự khác biệt so với API JSON thông thường
| API JSON thông thường | API Tạo/Cập nhật Seller | |
|---|---|---|
| Content-Type | application/json | multipart/form-data |
| Dữ liệu ký (plaintext) | Nguyên văn raw JSON body của request | JSON được dựng lại từ toàn bộ field form (xem mục 2) |
Baokim xác định request là "kiểu multipart" dựa vào header Content-Type. Nếu header này chứa
multipart/form-data hoặc application/x-www-form-urlencoded, hệ thống sẽ không dùng raw body
để verify chữ ký (vì raw body của multipart chứa cả boundary, header từng phần, dữ liệu nhị phân của
file — không thể ký/so khớp trực tiếp như JSON). Thay vào đó, hệ thống dựng lại 1 object JSON từ toàn
bộ field đã được parse, rồi mới đem đi verify.
2. Cách dựng plaintext để ký
Plaintext = JSON của toàn bộ field trong form (kể cả trường files), encode bằng flag
JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE.
plaintext = json_encode(<toàn bộ field form đã parse>, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
Lưu ý quan trọng khi dựng lại object này ở phía đối tác:
-
Các field text/array bình thường (
request_id,request_time,merchant_code,seller_id,platform, ...): đưa nguyên giá trị đã gửi vào object, giữ đúng kiểu dữ liệu (string/array) như đã khai ở bảng Request của từng API. -
Field
files— đây là điểm dễ sai nhất: nội dung nhị phân của file không được đưa vào plaintext. Ở phía server, mỗi phần tửfiletrong mảngfileslà 1 object file-handle nội bộ, không có thuộc tính public nào lộ ra ngoài — nên khijson_encode()toàn bộ payload, mỗi phần tửfilesẽ luôn được serialize thành object rỗng{}, bất kể tên file/nội dung file thực tế là gì. Khi đối tác tự dựng lại plaintext để ký, phải thay giá trị của khoáfilebằng{}(object rỗng), không phải tên file, không phải nội dung file, không phải base64 của file.Ví dụ minh hoạ (2 phần tử
files,typekhác nhau):"files": [
{ "type": "1", "file": {} },
{ "type": "2", "file": {} }
] -
Thứ tự field: đưa field vào object theo đúng thứ tự đã gửi trong multipart form (thường là thứ tự SDK/HTTP client của đối tác build request). Vì
json_encode()giữ nguyên thứ tự key của mảng nguồn, sai thứ tự sẽ ra plaintext khác → verify chữ ký thất bại.
3. Ví dụ đầy đủ
Với request mẫu ở trang Tạo Seller, plaintext cần ký là:
{
"request_id": "MERCHANT12345678901234510281",
"request_time": "2024-11-15 14:36:00",
"merchant_code": "MERCHANT001",
"sub_merchant_code": "MERCHANT001",
"seller_id": "SELLER123456",
"seller_name": "Nguyễn Văn A",
"platform": [
{
"type": "2",
"links": "https://shopee.vn/seller123",
"platform_seller_id": "SHOPEE123456"
}
],
"files": [
{ "type": "1", "file": {} },
{ "type": "2", "file": {} }
],
"representative_DOB": "1990-01-01",
"representative_ID_number": "001099012345",
"representative_name": "Nguyen Van A",
"representative_nationality": "Vietnam",
"representative_address": "1 Dai Co Viet Street, Hai Ba Trung District, Ha Noi",
"seller_business_type": "2",
"seller_business_registration_no": "0123456789",
"seller_phone": "0912345678",
"seller_email": "[email protected]",
"seller_business_description": "Online retail store selling electronics",
"seller_risk_level": "1",
"gc_code": "5045",
"mcc_code": "5399"
}
Sau khi có plaintext ở trên, các bước còn lại (ký bằng private key theo algorithm đã đăng ký,
base64-encode chữ ký, gắn vào header Signature cùng keyVersion/algorithm) thực hiện đúng như
hướng dẫn chung ở mục 6, trang Giới thiệu.
4. Lỗi thường gặp
| Triệu chứng | Nguyên nhân thường gặp |
|---|---|
| Chữ ký luôn sai dù dữ liệu gửi đúng | Đưa nội dung/tên file thật vào plaintext thay vì {} |
| Chữ ký sai chỉ khi có > 1 file | Thứ tự phần tử trong mảng files không khớp thứ tự đã gửi |
| Chữ ký đúng ở môi trường test JSON thuần nhưng sai khi submit multipart thật | Nhầm dùng cách ký raw body (application/json) cho request multipart/form-data |